import './public-path'
import Vue from 'vue'
// 项目提示工具开关、如生产环境应该关闭、开发环境可以打开
Vue.config.productionTip = true

import 'normalize.css/normalize.css' // A modern alternative to CSS resets

// 大屏使用到的插件
import dataView from '@jiaminghi/data-view'
Vue.use(dataView)

// 引入confirmDialog弹框确定组件
import $comfirmDialog from '@/components/Dialog/ComfirmDialog/index.js'
Vue.use($comfirmDialog)

/** ********** ElmentUI ************/
import 'element-ui/lib/theme-chalk/index.css'
import ElementUI from 'element-ui'
// element ui 组件方法封装
import './utils/element.js'
// 自定义
import './utils/directives.js'
Vue.use(ElementUI, {
  size: 'mini'
})

/** ********** 树表用到的插件 ************/
import 'vxe-table/lib/style.css' // 样式
import 'xe-utils' // 扩展的js
import VXETable from 'vxe-table' // 组件
VXETable.setup({
  size: 'small',
  zIndex: 1000 // 防止tooltip过长时被侧边栏遮挡
})
Vue.use(VXETable)
Vue.prototype.$XReadFile = VXETable.readFile

import App from './App'
import store from './store'

/** ********** 路由 ************/
import router from './router'
// 引入自定义的KeepAlive进行缓存，不使用vue自身的KeepAlive
import KeepAlive from './utils/keepAlive'
Vue.component('BaseKeepAlive', KeepAlive)
// 引入自定义的KeepAlive进行缓存，不使用vue自身的KeepAlive
import Pagenation from '@/components/Pagenation'
Vue.component('Pagenation', Pagenation)

// 全局统一自定义样式
import '@/styles/index.scss'
// 统一图标库
import '@/icons'
// 处理是否登录
import '@/permission'

// lodash
import _ from 'lodash'
Vue.prototype._ = _

/** ********** 全局公用到的 js方法 ************/
import Global from '../public/js/global'
Vue.prototype.Global = Global
import {
  ParamArr,
  SQLTable
} from '../public/js/paramarr'
Vue.prototype.SQLTable = SQLTable
Vue.prototype.ParamArr = ParamArr
// 消息推送参数数据
import Commonmsg from '../public/js/commonmsg.js'
Vue.prototype.Commonmsg = Commonmsg

// 树
import CompTree from '@/components/Tree'
Vue.component('CompTree', CompTree)
// 表格
import CompTable from '@/components/Table'
Vue.component('CompTable', CompTable)
// 树表格
import CompTreeTable from '@/components/TreeTable'
Vue.component('CompTreeTable', CompTreeTable)
// 弹窗里的确认取消按钮
import DialogBtn from '@/components/Dialog/DialogBtn'
Vue.component('DialogBtn', DialogBtn)
// 页面关闭按钮
import CloseButton from '@/components/Button/CloseButton'
Vue.component('CloseButton', CloseButton)

/**
 *  vue动态路由方法
 * @param {*} routerName 路由的vue组件路径
 * @param {*} tabName  标签名称
 * @param {*} params 传入参数 {id:xxxx} 取参直接在打开的vue组件里面使用: let data =  this.getRouteData(this)
 * @param {Object} 这个是路由的参数，和要打开的页面内容无关 下面是介绍
 *                 options.id: 有时相同的页面不应该打开多次 可以给相同的id进行区别
 */
Vue.prototype.$openUrl = function(routerName, tabName, params, options) {
  options = options || {}
  options.id = options.id || this.Global.getGuid()
  const p = {
    id: options.id,
    data: params,
    repName: tabName
  }

  sessionStorage.setItem(`route_params_${options.id}`, JSON.stringify(p))
  this.$router.push({
    name: routerName,
    params: p
  })
}

// 定时器全局方法
Vue.prototype.$setInterval = function(f, t) {
  !this.mySetIntervalTimerArr && (this.mySetIntervalTimerArr = [])
  const index = setInterval(f, t)
  this.mySetIntervalTimerArr.push(index)
  return index
}
// 延时器全局方法
Vue.prototype.$setTimeout = function(f, t) {
  !this.mySetIntervalTimerArr && (this.mySetIntervalTimerArr = [])
  const index = setTimeout(f, t)
  this.mySetIntervalTimerArr.push(index)
  return index
}
/**
 * 清除定时器
 * @param {*} timerArr  要清除的定时器序号、可以为单个或者数组 或者不传则清除当前组件全部定时器
 */
Vue.prototype.$clearInterval = function(timerArr) {
  if (typeof (timerArr) === 'number') timerArr = [timerArr]
  timerArr ??= (this.mySetIntervalTimerArr ?? [])
  for (let i = 0; i < timerArr.length; i++) {
    clearInterval(timerArr[i])
  }
}

/**
 * @description 公用输入框弹窗 简易用法
 * @param {*} title 标题
 * @param {*} label
 * @param {*} value 初始值
 * @param {*} options 扩展参数 具体查看 MainDialog页面
 */
Vue.prototype.$showInputDialog = function(title, label, value, options) {
  return this.$root.AomMainDialog.showInputDialog(title, label, value, options)
}

/**
 * @description 更新当前页签上修改过的标记
 * @param {Boolean} isModified 是否修改了
 */
Vue.prototype.$updatePageModified = function(isModified) {
  const fullPath = this.$route.fullPath
  this.$store.state.tagsView.visitedViews.map((a) => {
    if (a.fullPath === fullPath) {
      this.$set(a, 'isModified', isModified)
    }
  })
}

// 注册一个全局自定义指令 `v-url`
Vue.directive('url', function(el, binding) {
  const vueObj = binding.value.vue
  el.setAttribute('url', vueObj.$options.__file)
})

const vue = new Vue({
  router,
  store,
  render: h => h(App)
}).$mount('#vue2-app')
export default vue
